package edu.nepu.flink.api.window;

/**
 * @Date 2024/2/29 21:20
 * @Created by chenshuaijun
 */
public class WindowOverview {


    public static void main(String[] args) {
        /**
         * (1) 什么是窗口
         *      flink是用于实时计算的，因此处理的数据是无界，但是有时候我们需要将数据进行分块，
         *      这就用到了窗口。窗口的本质就是将无界的数据转化成有界的数据从而满足某些计算需求
         * (2) 窗口的分类
         *     1.1 按照驱动的类型进行分类
         *          1.1.1 keyedWindow
         *              时间窗口（处理时间和事件事件）
         *                 滚动窗口
         *                 滑动窗口（每个（时间/条数）步长触发一次计算）
         *                 会话窗口
         *              计数窗口
         *                 滚动窗口
         *                 滑动窗口
         *          1.1.2 Non-keyedWindow
         *              windowAll: 这个窗口的并行度为1，表示的是将上游所有的数据发送到下游的一个分区
         * (3) 窗口的组成
         *      分配器
         *      触发器
         *      驱逐器
         *      窗口函数
         * (4) 窗口的创建和触发计算
         *      创建：属于本窗口的第一条数据到来的时候才会去创建窗口。
         *          每条数据到来的时候都回去创建，这样会导致窗口的重复创建，所以flink会将窗口存储在一个单例的集合中
         *          窗口的开始时间计算方式：
         *                          （1）余数 = 数据中的时间 % 窗口大小
         *                          （2）start = 数据中的时间 - 余数
         *                          举个例子，我们以滚动窗口为例，假设窗口大小为10,当前到来的数据是27s
         *                          7 = 27 % 10
         *                          start = 27 - 7
         *                          所以这条数据所属的窗口是[20,30)
         *    触发计算的时间：时间进展 > maxTs(时间（事件时间/处理时间）进展) - 1
         *
         *    窗口的关闭时间：时间进展 > maxTs(时间（事件时间/处理时间）进展) - 1 + 乱序程度
         *
         *    窗口允许迟到时间： 这个只会关系到窗口的销毁，不会影响事件事件的进展
         */
    }
}
